<?php


namespace app\back\controller;


use app\back\model\MenuModel;
use app\middleware\BackAuth;
use think\facade\Validate;
use app\Request;
use think\validate\ValidateRule;
use think\response\Json;

/**菜单管理
 * Class Menu
 * @package app\back\controller
 */
class Menu
{
    protected $middleware = [BackAuth::class];

    /**获取权限列表
     * @return Json
     */
    public function getAuthList()
    {
        // 逻辑处理
        return MenuModel::getAuthList();
    }

    /**获取单个权限
     * @param Request $request
     * @return Json
     */
    public function getAuthOnly(Request $request)
    {
        // 获取参数
        $input['id'] = $request->post('id');
        // 参数校验
        $validate = Validate::rule([
            'id' => ValidateRule::regex("/^[1-9][0-9]{0,}$/", '非法数据')
        ]);

        if (!$validate->check($input)) {
            return jsonFail($validate->getError());
        }
        // 逻辑处理
        return MenuModel::getAuthOnly($input);
    }

    /**编辑权限
     * @param Request $request
     * @return Json
     */
    public function editAuth(Request $request)
    {
        // 获取参数
        $input['id'] = $request->post('id');
        $input['name'] = $request->post('name');
        $input['level'] = $request->post('level');
        $input['icon'] = $request->post('icon');
        $input['api'] = $request->post('api');
        $input['component'] = $request->post('component');
        $input['router'] = $request->post('router');
        $input['sort'] = $request->post('sort');

        // 参数校验
        $validate = Validate::rule([
            'id' => ValidateRule::regex("/^[1-9][0-9]{0,}$/", '非法数据'),
            'name' => ValidateRule::isRequire(null, '缺少参数'),
            'level' => ValidateRule::regex("/^[0-2]$/", '非法数据'),
            'icon' => function($value, $all){
                if ($all['level'] != 0) {
                    return true;
                } elseif ($all['level'] == 0  && $value != '') {
                    return true;
                } else {
                    return '顶级菜单必须有icon';
                }
            },
            'api' => function($value, $all){
                if ($all['level'] != 2) {
                    return true;
                } elseif ($all['level'] == 2  && $value != '') {
                    return true;
                } else {
                    return '2级菜单必须有接口';
                }
            },
            'component' => function($value, $all){
                if ($all['level'] != 1) {
                    return true;
                } elseif ($all['level'] == 1  && $value != '') {
                    return true;
                } else {
                    return '1级菜单必须有前端组件';
                }
            },
            'router' => function($value, $all){
                if ($all['level'] != 1) {
                    return true;
                } elseif ($all['level'] == 1  && $value != '') {
                    return true;
                } else {
                    return '1级菜单必须有前端路由';
                }
            },
            'sort' => ValidateRule::regex('/^(([1-9])|([1-9]\d)|([1-2][0-5][0-5]))$/'),
        ]);

        if (!$validate->check($input)) {
            return jsonFail($validate->getError());
        }
        // 逻辑处理
        return MenuModel::editAuth($input);
    }

    /**添加权限
     * @param Request $request
     * @return Json
     */
    public function addAuth(Request $request)
    {
        // 获取参数
        $input['pid'] = $request->post('pid');
        $input['name'] = $request->post('name');
        $input['level'] = $request->post('level');
        $input['icon'] = $request->post('icon');
        $input['api'] = $request->post('api');
        $input['component'] = $request->post('component');
        $input['router'] = $request->post('router');
        $input['sort'] = $request->post('sort');
        // 参数校验
        $validate = Validate::rule([
            'pid' => ValidateRule::regex("/^[0-9]{1,}$/", '非法数据'),
            'name' => ValidateRule::isRequire(null, '缺少参数'),
            'level' => ValidateRule::regex("/^(-1)|(0)|(1)$/", '非法数据'),
            'icon' => function($value, $all){
                if ($all['level'] != -1) {
                    return true;
                } elseif ($all['level'] == -1  && $value != '') {
                    return true;
                } else {
                    return '顶级菜单必须有icon';
                }
            },
            'api' => function($value, $all){
                if ($all['level'] != 1) {
                    return true;
                } elseif ($all['level'] == 1  && $value != '') {
                    return true;
                } else {
                    return '2级菜单必须有接口';
                }
            },
            'component' => function($value, $all){
                if ($all['level'] != 0) {
                    return true;
                } elseif ($all['level'] == 0  && $value != '') {
                    return true;
                } else {
                    return '1级菜单必须有前端组件';
                }
            },
            'router' => function($value, $all){
                if ($all['level'] != 0) {
                    return true;
                } elseif ($all['level'] == 0  && $value != '') {
                    return true;
                } else {
                    return '1级菜单必须有前端路由';
                }
            },
            'sort' => ValidateRule::regex('/^(([1-9])|([1-9]\d)|([1-2][0-5][0-5]))$/'),
        ]);

        if (!$validate->check($input)) {
            return jsonFail($validate->getError());
        }
        // 逻辑处理
        return MenuModel::addAuth($input);
    }

    /**删除权限
     * @param Request $request
     * @return Json
     */
    public function delAuth(Request $request)
    {
        // 获取参数
        $input['id'] = $request->post('id');
        // 参数校验
        $validate = Validate::rule([
            'id' => ValidateRule::regex("/^[1-9][0-9]*$/", '非法数据'),
        ]);

        if (!$validate->check($input)) {
            return jsonFail($validate->getError());
        }
        // 逻辑处理
        return MenuModel::delAuth($input);
    }

    /**获取当前管理员权限
     * @param Request $request
     * @return Json
     */
    public function getAdminAuth(Request $request)
    {
        // 逻辑处理
        return MenuModel::getAdminAuth($request->info);
    }

    /**获取超管获取左侧列表
     * @param Request $request
     * @return Json
     */
    public function getMenuList(Request $request)
    {
        // 逻辑处理
        return MenuModel::getMenuList($request->info);
    }

    /**编辑超管左侧菜单
     * @param Request $request
     * @return Json
     */
    public function editMenu(Request $request)
    {
        // 获取参数
        $input['left_menu_ids'] = $request->post('left_menu_ids');

        // 参数校验
        $validate = Validate::rule([
            'left_menu_ids' => ValidateRule::isRequire(null, '缺少参数')
        ]);

        if (!$validate->check($input)) {
            return jsonFail($validate->getError());
        }
        // 逻辑处理
        return MenuModel::editMenu($input);
    }
}